package framework.forms;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;

import webdriver.BaseForm;
import webdriver.elements.Button;
import webdriver.elements.Link;

import framework.forms.other.InfoZakazchikovPostavwikovForm;
import framework.forms.other.StatistikaForm;
import framework.forms.other.VoprosyOtvetyForm;

/** Базовая форма с верхним меню.
 */

public class BaseFormWithTopMenu extends BaseForm{

	/** Базовый конструктор.
	 * @param titleLocator локатор
	 * @param title название формы
	 */
	protected BaseFormWithTopMenu(final By titleLocator, final String title) {
		super(titleLocator, title);
	}

	// шаблон ссылок верхнего меню
	private final String topMenuItemTemplate = "//div[@id='pmenu']//ul//li[@id='%s']//a";
	// кнопка "Продолжить" на странице предупреждения о наличии КриптоПро
	private static Button continueBtn = new Button(By.xpath("//div[@class='jquery-msgbox-buttons']/button[contains(.,'Продолжить')]"), "Продолжить");
	// шаблон локатора к полю таблицы
	private static String dataTemplate = "//table[%s]//tbody//tr[%s]//td[2]/span";
	// кнопка "Выход" из ЛК
	private static final Link EXIT_LNK = new Link(By.xpath("//a/cufon[@alt='Выход']"),"Выход");

	/** Возвращает шаблон локатора к полю таблицы
	 * @return шаблон локатора к полю таблицы
	 */
	public String getDataTemplateLocator(){
		return dataTemplate;
	}

	/** Нажимает на кнопку "Выход" и ждет перехода на главную сайта
	 */
	public void clickExit(){
		EXIT_LNK.clickAndWait();
		new MainForm();
	}

	/** Возвращает кнопку "Продолжить" диалогового окна
	 * @return кнопка "Продолжить"
	 */
	public static Button getContinueBtn(){
		return continueBtn;
	}

	/** Верхнее меню
	 */
	public enum TOP_MENU{
		GLAVNAYA("Главная"), INFO_ZAKAZCHIKOV_POSTAVWIKOV ("Информация для заказчиков и поставщиков"), VOPROSY_OTVETY("Вопросы и ответы"), STATISTIKA("Статистика");

		private String	val;

		/** Задает название для пункта меню
		 * @param name наименование
		 */
		TOP_MENU(final String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}

	/**
	 * Имплементация метода navigateToTopMenu с isNewWindow = false
	 * @param item пункт меню
	 */
	public final void navigateToTopMenu(final TOP_MENU item){
		boolean b = false;
		navigateToTopMenu(item, b);
	}

	/**
	 * Производит навигацию по верхнему меню
	 * @param item пункт меню
	 * @param isNewWindow открывается ли по ссылке новое окно
	 * @return базовая форма с меню вверху
	 */
	public final BaseFormWithLeftSlideBar navigateToTopMenu(final TOP_MENU item, boolean isNewWindow){
		Link l = null;
		switch(item){
			case GLAVNAYA:
				l = new Link(By.xpath(String.format(topMenuItemTemplate, "menu-1")),item.toString());
			checkNewWindowAndClick(isNewWindow, l);
			return new MainForm();
			case INFO_ZAKAZCHIKOV_POSTAVWIKOV:
				l = new Link(By.xpath(String.format(topMenuItemTemplate, "menu-2")),item.toString());
			checkNewWindowAndClick(isNewWindow, l);
				return new InfoZakazchikovPostavwikovForm();
			case VOPROSY_OTVETY:
				l = new Link(By.xpath(String.format(topMenuItemTemplate, "menu-3")),item.toString());
				checkNewWindowAndClick(isNewWindow, l);
				return new VoprosyOtvetyForm();
			case STATISTIKA:
				l = new Link(By.xpath(String.format(topMenuItemTemplate, "menu-4")),item.toString());
				checkNewWindowAndClick(isNewWindow, l);
				return new StatistikaForm();
			default:
				return new MainForm();
		}
	}

	/**
	 * В зависимости от значения параметра isNewWindow открывает ссылку l либо в новом окне, либо в том же
	 * @param isNewWindow открывается ли по ссылке новое окно
	 * @param l ссылка
	 */
	private void checkNewWindowAndClick(boolean isNewWindow, Link l) {
		if (isNewWindow){
			l.clickAndWaitForNewWindow();
			browser.selectLastWindow();
			} else {
		l.click();
		}
	}

	/**
	 * Прокликивает пункты верхнего горизонтального меню
	 */
	public void checkTopMenuItems (){
		for (TOP_MENU item: TOP_MENU.values()){
			if (!item.equals(TOP_MENU.GLAVNAYA)){
			navigateToTopMenu(item);
			}
		}
	}

	/**
	 * Кликает по элементу с помощью js по id элемента
	 * @param elementId - element Id to perform click on it
	 */
	public void jsClickAndWait(String elementId){
		 info("Клик c помощью JS по элементу с id = " + elementId);
		 String jsTemplate = "document.getElementById('%s').click();";
		  ((JavascriptExecutor) browser.getDriver()).executeScript(String.format(jsTemplate, elementId));
		  browser.waitForPageToLoad();
	}
}
